package com.sdweizan.sdk.bytedance.bean.order;

import com.alibaba.fastjson.annotation.JSONField;
import com.sdweizan.sdk.bytedance.bean.BdBaseRequest;
import com.sdweizan.sdk.bytedance.constants.BdConstants;
import java.util.List;
import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class BdOrderPushRequest implements BdBaseRequest {

  @JSONField(name = "app_name")
  private String appName;

  @JSONField(name = "access_token")
  private String accessToken;

  /** 前端登录后* */
  @JSONField(name = "open_id")
  private String openId;

  @JSONField(name = "order_detail")
  private String orderDetail;

  /**
   * 0：待支付 1：已支付 2：已取消（用户主动取消或者超时未支付导致的关单） 4：已核销（核销状态是整单核销,即一笔订单买了 3 个券，核销是指 3 个券核销的整单） 5：退款中 6：已退款
   * 8：退款失败*
   */
  @JSONField(name = "order_status")
  private Integer orderStatus;

  /** 订单类型，枚举值: 0：普通小程序订单（非POI订单） 9101：团购券订单（POI 订单） 9001：景区门票订单（POI订单）* */
  @JSONField(name = "order_type")
  private Integer orderType = 0;

  /** 10位秒级时间戳* */
  @JSONField(name = "update_time")
  private Long updateTime;

  @Override
  public String requestUri() {
    return BdConstants.API_HOST + "/api/apps/order/v2/push";
  }

  @Data
  @Builder
  public static class OrderData {
    /** 开发者侧业务单号。用作幂等控制。该订单号是和担保支付的支付单号绑定的，也就是预下单时传入的 out_order_no 字段* */
    @JSONField(name = "order_id")
    private String orderId;

    /** 13 位毫秒时间戳* */
    @JSONField(name = "create_time")
    private Long createTime;

    /** 待支付 已支付 已取消 已超时 已核销 退款中 已退款 退款失败* */
    private String status;

    /** 订单商品总数* */
    private Integer amount;

    @JSONField(name = "total_price")
    private Long totalPrice;

    /** 小程序订单详情页 path* */
    @JSONField(name = "detail_url")
    private String detailUrl;

    @JSONField(name = "item_list")
    private List<OrderItem> itemList;
  }

  @Data
  @Builder
  public static class OrderItem {
    /** 开发者侧商品 ID* */
    @JSONField(name = "item_code")
    private String itemCode;

    private String img;
    private String title;

    /** not required* */
    @JSONField(name = "sub_title")
    private String subTitle;

    private Integer amount;
    private Long price;
  }
}
